from lxml import etree

def parse_arxml(file_path):
    # 解析 ARXML 文件
    tree = etree.parse(file_path)
    root = tree.getroot()

    # 定义命名空间
    namespace = {'autosar': 'http://autosar.org/schema/r4.0'}

    # 使用 XPath 查找所有带有 _Enum 尾缀的 SHORT-NAME 标签
    enum_names = root.xpath(".//autosar:SHORT-NAME[re:match(text(), '.*_Enum$')]", namespaces={'re': 'http://exslt.org/regular-expressions', 'autosar': 'http://autosar.org/schema/r4.0'})

    if enum_names:
        enum_definitions = []
        for enum_name in enum_names:
            # 获取枚举名称
            enum_name_text = enum_name.text
            # 获取枚举的父标签
            parent = enum_name.getparent()
            # 查找 COMPU-INTERNAL-TO-PHYS 标签
            compu_internal_to_phys = parent.find('.//{http://autosar.org/schema/r4.0}COMPU-INTERNAL-TO-PHYS')
            if compu_internal_to_phys is not None:
                # 解析并生成 C 语言风格的枚举定义
                enum_definitions.append(f"typedef {enum_name_text} {enum_name_text}")

    # 查找所有带有 CS_ 前缀的 SHORT-NAME 标签
    cs_names = root.xpath(".//autosar:SHORT-NAME[re:match(text(), '^CS_.*')]", namespaces={'re': 'http://exslt.org/regular-expressions', 'autosar': 'http://autosar.org/schema/r4.0'})

    if cs_names:
        for cs_name in cs_names:
            # 获取 CS_ 前缀的名称
            cs_name_text = cs_name.text
            # 获取 CS_ 前缀的父标签
            parent = cs_name.getparent()
            # 查找 TYPE-REFERENCE-REF 标签
            type_reference_ref = parent.find('.//{http://autosar.org/schema/r4.0}TYPE-REFERENCE-REF')
            if type_reference_ref is not None:
                # 获取 TYPE-REFERENCE-REF 中的内容
                type_ref_text = type_reference_ref.text
                # 提取 /AUTOSAR/StdTypes/ 后的内容
                y = type_ref_text.split('/AUTOSAR/StdTypes/')[-1]
                # 打印 typedef y x
                print(f"typedef {y} {cs_name_text}")

    return enum_definitions


def generate_c_enum_definition(element, enum_name):
    # 查找 COMPU-SCALES 标签
    compu_scales = element.find('.//{http://autosar.org/schema/r4.0}COMPU-SCALES')
    if compu_scales is not None:
        enum_lines = [f"typedef enum {{\n"]
        for compu_scale in compu_scales:
            lower_limit = compu_scale.find('.//{http://autosar.org/schema/r4.0}LOWER-LIMIT')
            vt = compu_scale.find('.//{http://autosar.org/schema/r4.0}VT')
            if lower_limit is not None and vt is not None:
                enum_lines.append(f"    {vt.text} = {lower_limit.text},\n")
        enum_lines.append(f"}} {enum_name};\n")
        return ''.join(enum_lines)
    return ""

# 调用函数解析并生成 C 语言风格的枚举定义，并输出到 var.h 文件
parse_arxml("InterDomain.arxml")
